﻿/*
作者：张澎
版本：v1.7
时间：2016-01-11 
描述：表单验证插件  依赖JQ库   , 管理后台单独优化版本
*/
; (function ($) {
    $.fn.Verify = function (options) {

        var defaults = {
            mode: "blur-change", //验证方式    change 输入的时候即时验证    blur 失去焦点验证  默认使用 blur验证  blur-change 是两者结合
            subtn: null, //提交按钮 $(".btn")  jq对象
            callback: null, //实时验证回调函数  
            submit: null //提交回调
        }
        var ops = $.extend(defaults, options);
        
        var verify_role; // 默认验证
        var verify_this; //当前对象
        var verify_cur = true; //验证状态  默认true  为了让第一次验证通过
        var verify_event; //验证事件  每个浏览器都不同
        var verify_type; //验证类型, 当前类型
        var verify_res = new Array(); //提交时候的验证结果
        var SysRegion = {
            email: /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/, //邮箱
            ip: /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g, //ip
            mobile: /^[1][3|5|7|8][0-9]{9}$/, //手机 
            phoneWithArea: /^[0][1-9]{2,3}-[0-9]{5,10}$/,//带区号的电话
            phone: /^[1-9]{1}[0-9]{5,8}$/,//无区号的电话
            notnull: /[^\s]/, //空字符串
            integer: /^[-]{0,1}[0-9]{1,}$/,//整数  正负都通过
            number: /^[0-9]+$/, //正整数
            decimal: /^[-]{0,1}(\d+)[\.]+(\d+)$/,//小数
            money: /^[0-9]+[\.][0-9]{0,2}$/, //金额 小数点后允许2位
            numOrLetter: /^[0-9a-zA-Z]+$/,//是否由字母或数字组成
            qq: /^[1-9]\d{4,8}$/,//QQ
            eword: /^[A-Za-z\s]+$/,//只能为字母
            chinese: /^[\u0391-\uFFE5]+$/,//汉子
            post: /^[1-9]\d{5}$/,//邮政编码
            url: /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,//网址
            idcard: /^d{15}|d{18}$/ //身份证号
        };
        //正则验证  reg 验证的标识   str  待验证的字符串
        function _reg(reg, str) {
            return SysRegion[reg].test(str);
        }

        //验证每个元素   循环调用此方法即可 //t=当前验证对象
        function _verify(t) {
            verify_this = $(t); //当前验证对象
            verify_type = verify_this.attr("field_type").toUpperCase();
            switch (verify_type) {
                case "INPUT":
                case "PASSWORD":
                case "TEXTAREA":
                case "TIME":
                    verify_role = verify_this.attr("verify").split(','); //规则验证
                    if (verify_role.length > 0) {
                        for (var i = 0; i < verify_role.length; i++) {
                            verify_cur = _reg(verify_role[i], $.trim(verify_this.val()));
                            if (!verify_cur) { break; }
                        }
                    }
                    break;
                case "EDITOR":
                    verify_cur = true;
                    break;
                case "SELECT":
                    verify_cur = true;
                    break;
                case "MULTIPLESELECT":
                case "RADIO":
                case "CHECKBOX":
                case "FILEUPLOAD":
                case "IMGUPLOAD":
                case "MULTIPLEIMGUPLOAD":
                    verify_cur = true;
                    break;
                default:
                    verify_cur = true;
                    break;
            }
        }
        //判断当前验证条件 鼠标经过还是当值改变的时候
        function _setevent() {
            switch (ops.mode) {
                case "blur":
                    verify_event = "blur";
                    break;
                case "change":
                    verify_event = "input propertychange";
                    break;
                case "blur-change":
                    verify_event = "input propertychange blur";
                    break;
                default:
                    verify_event = "blur";
                    break;
            }
        }
        var verify_body = $(this);
        //console.log(verify_body);
        //if (ops.mode == "blur" || ops.mode == "change") {
        //alert(verify_body.attachEvent)
        _setevent();
        verify_body.bind(verify_event, function () {
            _verify(this);
            ops.callback(verify_cur, verify_type, $(this));
        })

        //如果有指定提交按钮
        if (ops.subtn) {
            ops.subtn.on("click", function () { //绑定点击事件
                if (ops.submit) { //如果有指定提交的回调
                    verify_res.length = 0;
                    $(verify_body).each(function () { //遍历检查
                        _verify(this);
                        //if (!verify_cur) { 
                        ops.callback(verify_cur, verify_type, $(this));
                        verify_res.push(verify_cur ? 1 : 0);
                        //} //如果验证失败,调用参数 加入检查数组

                    })
                    //ops.submit(verify_res.length == 0); //如果数组中没有0 则全部通过 返回true
                    ops.submit(verify_res.indexOf(0) == -1); //如果数组中没有0 则全部通过 返回true
                }
            })
        }
    }
})(jQuery);